#include "shmem.h"

static struct shm_param para;
union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};
struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};
static int *total;  //指向共享内存中数据节点总个数
static struct std_node *node_arr;  //指向共享内存中节点缓存数组头

#define MAX_NODE 16  //最大支持结构点数目，实际可用是15
#define STD_NODE_LEN sizeof(struct std_node)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

int main(int argc, char *argv[])
{
    int ret = -1;

    ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
    if(ret < 0)
    {
        return -1;
    }

    void *node_p = shm_getaddr(&para);
    if(node_p == NULL)
    {
        return -1;
    }

    memset(node_p, 0, MAX_NODE_SIZE);

    //前4个字节存储实际的结构点数目
    total = (int *)node_p;
    //后面空间存储数据点
    node_arr = (struct std_node *)(node_p + sizeof(int));

    *total = 14;  //14个结构点，前1-9为单片机的数据状态和设备状态，第一个和后4个为modbus的数据状态和设备状态

    //第1个点赋值
    node_arr[0].ret=-1;
    node_arr[0].key=0; //0为关 1为开
    node_arr[0].type=4; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[0].dev_type=1; //0为单片机，1为modbus
    node_arr[0].new_val.i_val=0;//放入采集到的数据
    node_arr[0].old_val.i_val=0;//旧数据


    //第2个点赋值
    node_arr[1].ret=-1;
    node_arr[1].key=0; //0为关 1为开
    node_arr[1].type=1; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[1].dev_type=0; //0为单片机，1为modbus
    node_arr[1].new_val.i_val=0;//放入采集到的数据
    node_arr[1].old_val.i_val=0;//旧数据

    //第3个点赋值
    node_arr[2].ret=-1;
    node_arr[2].key=0; //0为关 1为开
    node_arr[2].type=2; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[2].dev_type=0; //0为单片机，1为modbus
    node_arr[2].new_val.i_val=0;//放入采集到的数据
    node_arr[2].old_val.i_val=0;//旧数据

    //第4个点赋值
    node_arr[3].ret=-1;
    node_arr[3].key=0; //0为关 1为开
    node_arr[3].type=3; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[3].dev_type=0; //0为单片机，1为modbus
    node_arr[3].new_val.i_val=0;//放入采集到的数据
    node_arr[3].old_val.i_val=0;//旧数据

    //第5个点赋值
    node_arr[4].ret=-1;
    node_arr[4].key=0; //0为关 1为开
    node_arr[4].type=4; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[4].dev_type=0; //0为单片机，1为modbus
    node_arr[4].new_val.i_val=0;//放入采集到的数据
    node_arr[4].old_val.i_val=0;//旧数据

    //第6个点赋值
    node_arr[5].ret=-1;
    node_arr[5].key=0; //0为关 1为开
    node_arr[5].type=5; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[5].dev_type=0; //0为单片机，1为modbus
    node_arr[5].new_val.i_val=0;//放入采集到的数据
    node_arr[5].old_val.i_val=0;//旧数据

    //第7个点赋值
    node_arr[6].ret=-1;
    node_arr[6].key=0; //0为关 1为开
    node_arr[6].type=6; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[6].dev_type=0; //0为单片机，1为modbus
    node_arr[6].new_val.i_val=0;//放入采集到的数据
    node_arr[6].old_val.i_val=0;//旧数据

    //第8个点赋值
    node_arr[7].ret=-1;
    node_arr[7].key=0; //0为关 1为开
    node_arr[7].type=7; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[7].dev_type=0; //0为单片机，1为modbus
    node_arr[7].new_val.i_val=0;//放入采集到的数据
    node_arr[7].old_val.i_val=0;//旧数据

    //第9个点赋值
    node_arr[8].ret=-1;
    node_arr[8].key=0; //0为关 1为开
    node_arr[8].type=8; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[8].dev_type=0; //0为单片机，1为modbus
    node_arr[8].new_val.i_val=0;//放入采集到的数据
    node_arr[8].old_val.i_val=0;//旧数据

    //第10个点赋值
    node_arr[9].ret=-1;
    node_arr[9].key=0; //0为关 1为开
    node_arr[9].type=9; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[9].dev_type=0; //0为单片机，1为modbus
    node_arr[9].new_val.i_val=0;//放入采集到的数据
    node_arr[9].old_val.i_val=0;//旧数据

    //第11个点赋值
    node_arr[10].ret=-1;
    node_arr[10].key=0; //0为关 1为开
    node_arr[10].type=0; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[10].dev_type=1; //0为单片机，1为modbus
    node_arr[10].new_val.i_val=0;//放入采集到的数据
    node_arr[10].old_val.i_val=0;//旧数据

    //第12个点赋值
    node_arr[11].ret=-1;
    node_arr[11].key=0; //0为关 1为开
    node_arr[11].type=1; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[11].dev_type=1; //0为单片机，1为modbus
    node_arr[11].new_val.i_val=0;//放入采集到的数据
    node_arr[11].old_val.i_val=0;//旧数据

    //第13个点赋值
    node_arr[12].ret=-1;
    node_arr[12].key=0; //0为关 1为开
    node_arr[12].type=2; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[12].dev_type=1; //0为单片机，1为modbus
    node_arr[12].new_val.i_val=0;//放入采集到的数据
    node_arr[12].old_val.i_val=0;//旧数据
    //第14个点赋值
    node_arr[13].ret=-1;
    node_arr[13].key=0; //0为关 1为开
    node_arr[13].type=3; //单片机：1为温度 2为湿度 3为红外线 4为火焰(烟雾) 5为车灯 6为 7为警报 8为空调 9为雨刷器
                        //modbus：0为加速度 1为油罐容量 2为车窗 3为车门 4为压力
    node_arr[13].dev_type=1; //0为单片机，1为modbus
    node_arr[13].new_val.i_val=0;//放入采集到的数据
    node_arr[13].old_val.i_val=0;//旧数据
    return 0;
}
